<?php

# ========================================================================#
#
#  Author:    Jarrod Oberto
#  Version:	 1.0
#  Date:      17-Jan-10
#  Purpose:   Resizes and saves image
#  Requires : Requires PHP5, GD library.
#  Usage Example:
#                     include("classes/resize_class.php");
#                     $resizeObj = new resize('images/cars/large/input.jpg');
#                     $resizeObj -> resizeImage(150, 100, 0);
#                     $resizeObj -> saveImage('images/cars/large/output.jpg', 100);
#
#
# ========================================================================#

Class Image {
	// *** Class variables
	private $image;
	private $width;
	private $height;
	private $imageResized;
	private $saveName;
	private $extension;
	public $fileName;
	function __construct() {

	}

	function fromUpload($upload) {
		$fileUpload = $upload['tmp_name'][0];
		$name = basename($upload['name'][0]);
		$extension = strtolower(strrchr($name, '.'));
		$this->extension = $extension;
		// *** Open up the file
		$this -> image = $this -> openImage($fileUpload, $extension);

		// *** Get width and height
		$this -> width = imagesx($this -> image);
		$this -> height = imagesy($this -> image);
	}

	function fromFile($file) {
		$this -> saveName = basename($file);
		$extension = strtolower(strrchr($this -> saveName, '.'));
		// *** Open up the file
		$this -> image = $this -> openImage($file, $extension);

		// *** Get width and height
		$this -> width = imagesx($this -> image);
		$this -> height = imagesy($this -> image);
	}

	function setSaveName($name) {
		$this -> saveName = $name;
	}

	## --------------------------------------------------------

	private function openImage($file, $extension) {
		// *** Get extension
		if ($extension == '') {
			$extension = strtolower(strrchr($file, '.'));
		}

		switch($extension) {
			case '.jpg' :
			case '.jpeg' :
				$img = imagecreatefromjpeg($file);
				break;
			case '.gif' :
				$img = @imagecreatefromgif($file);
				break;
			case '.png' :
				$img = @imagecreatefrompng($file);
				break;
			default :
				$img = false;
				break;
		}
		return $img;
	}

	public function cropByPosition($dWidth,$dHeight,$x,$y,$width,$height) {
		$this -> imageResized = imagecreatetruecolor($width, $height);
		imagecopyresampled($this -> imageResized , $this -> image, 0, 0, $x, $y, $width, $height, $width, $height);
	}

	## --------------------------------------------------------

	public function resizeImage($newWidth, $newHeight, $option = "auto", $x1 = '', $y1 = '', $x2 = '', $y2 = '') {
		// *** Get optimal width and height - based on $option
		$optionArray = $this -> getDimensions($newWidth, $newHeight, $option);

		$optimalWidth = $optionArray['optimalWidth'];
		$optimalHeight = $optionArray['optimalHeight'];

		// *** Resample - create image canvas of x, y size
		$this -> imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
		
		

		if ($this->extension == ".png") {
			imagealphablending($this -> imageResized, false);
			imagesavealpha($this -> imageResized, true);
			$transparent = imagecolorallocatealpha($this -> imageResized, 255, 255, 255, 127);
			imagefilledrectangle($this -> imageResized, 0, 0, $optimalWidth, $optimalHeight, $transparent);
		}
		imagecopyresampled($this -> imageResized, $this -> image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this -> width, $this -> height);
		// *** if option is 'crop', then crop too
		if ($option == 'crop') {
			$this -> crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
		}
		if ($option == "cropByPosition") {
			$this -> cropByPositon($optimalWidth, $optimalHeight, $newWidth, $newHeight, $x1, $y1, $x2, $y2);
		}
	}

	## --------------------------------------------------------

	private function getDimensions($newWidth, $newHeight, $option) {

		switch ($option) {
			case 'exact' :
				$optimalWidth = $newWidth;
				$optimalHeight = $newHeight;
				break;
			case 'portrait' :
				$optimalWidth = $this -> getSizeByFixedHeight($newHeight);
				$optimalHeight = $newHeight;
				break;
			case 'landscape' :
				$optimalWidth = $newWidth;
				$optimalHeight = $this -> getSizeByFixedWidth($newWidth);
				break;
			case 'auto' :
			case 'cropByPosition' :
				$optionArray = $this -> getSizeByAuto($newWidth, $newHeight);
				$optimalWidth = $optionArray['optimalWidth'];
				$optimalHeight = $optionArray['optimalHeight'];
				break;
			case 'crop' :
				$optionArray = $this -> getOptimalCrop($newWidth, $newHeight);
				$optimalWidth = $optionArray['optimalWidth'];
				$optimalHeight = $optionArray['optimalHeight'];
				break;
		}
		return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
	}

	## --------------------------------------------------------

	private function getSizeByFixedHeight($newHeight) {
		$ratio = $this -> width / $this -> height;
		$newWidth = $newHeight * $ratio;
		return $newWidth;
	}

	private function getSizeByFixedWidth($newWidth) {
		$ratio = $this -> height / $this -> width;
		$newHeight = $newWidth * $ratio;
		return $newHeight;
	}

	private function getSizeByAuto($newWidth, $newHeight) {
		if ($this -> height < $this -> width)
		// *** Image to be resized is wider (landscape)
		{
			$optimalWidth = $newWidth;
			$optimalHeight = $this -> getSizeByFixedWidth($newWidth);
		} elseif ($this -> height > $this -> width)
		// *** Image to be resized is taller (portrait)
		{
			$optimalWidth = $this -> getSizeByFixedHeight($newHeight);
			$optimalHeight = $newHeight;
		} else
		// *** Image to be resizerd is a square
		{
			if ($newHeight < $newWidth) {
				$optimalWidth = $newWidth;
				$optimalHeight = $this -> getSizeByFixedWidth($newWidth);
			} else if ($newHeight > $newWidth) {
				$optimalWidth = $this -> getSizeByFixedHeight($newHeight);
				$optimalHeight = $newHeight;
			} else {
				// *** Sqaure being resized to a square
				$optimalWidth = $newWidth;
				$optimalHeight = $newHeight;
			}
		}

		return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
	}

	## --------------------------------------------------------

	private function getOptimalCrop($newWidth, $newHeight) {

		$heightRatio = $this -> height / $newHeight;
		$widthRatio = $this -> width / $newWidth;

		if ($heightRatio < $widthRatio) {
			$optimalRatio = $heightRatio;
		} else {
			$optimalRatio = $widthRatio;
		}

		$optimalHeight = $this -> height / $optimalRatio;
		$optimalWidth = $this -> width / $optimalRatio;

		return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
	}

	## --------------------------------------------------------

	private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight) {
		// *** Find center - this will be used for the crop
		$cropStartX = ($optimalWidth / 2) - ($newWidth / 2);
		$cropStartY = ($optimalHeight / 2) - ($newHeight / 2);

		$crop = $this -> imageResized;
		//imagedestroy($this->imageResized);

		// *** Now crop from center to exact requested size
		$this -> imageResized = imagecreatetruecolor($newWidth, $newHeight);
		imagecopyresampled($this -> imageResized, $crop, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight, $newWidth, $newHeight);
	}

	private function cropByPositon($optimalWidth, $optimalHeight, $newWidth, $newHeight, $x1, $y1, $x2, $y2) {

		$crop = $this -> imageResized;
		//imagedestroy($this->imageResized);
		/*
		 imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
		 $targ_w,$targ_h,$_POST['w'],$_POST['h']);*/
		// *** Now crop from center to exact requested size
		$width = 165;
		$this -> imageResized = imagecreatetruecolor($width, $width);
		$newWidth = $x2 - $x1;
		$height = $y2 - $y1;

		imagecopyresampled($this -> imageResized, $crop, 0, 0, $x1, $y1, $width, $width, 165, 165);
		//imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)

	}

	## --------------------------------------------------------
	public function saveImage($savePath, $imageQuality = "100") {

		// *** Get extension
		$savePath = $savePath . $this -> saveName;
		$extension = strrchr($savePath, '.');
		$extension = strtolower($extension);
		switch($extension) {
			case '.jpg' :
			case '.jpeg' :
				if (imagetypes() & IMG_JPG) {
					imagejpeg($this -> imageResized, $savePath, $imageQuality);
				}
				break;

			case '.gif' :
				if (imagetypes() & IMG_GIF) {
					imagegif($this -> imageResized, $savePath);
				}
				break;

			case '.png' :
				// *** Scale quality from 0-100 to 0-9
				$scaleQuality = round(($imageQuality / 100) * 9);

				// *** Invert quality setting as 0 is best, not 9
				$invertScaleQuality = 9 - $scaleQuality;

				if (imagetypes() & IMG_PNG) {
					
					
					 imagealphablending($this -> imageResized, false);
    				imagesavealpha($this -> imageResized,true);
    				 imagepng($this -> imageResized, $savePath);
					
					
				}
				break;

			// ... etc

			default :
				// *** No extension - No save.
				break;
		}

		imagedestroy($this -> imageResized);
		return true;
	}

	## --------------------------------------------------------

}
?>
